package com.niit.syy.unit_priceByhouse_type;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class Unit_priceByhouse_typeReducer extends Reducer<Text, Text, Text, Text> {
    private Text outv = new Text();
    private Map<String, Integer> map = new HashMap<>();
    private int count = Integer.MIN_VALUE;// 统计出现最多的次数就是主要户型

    /**
     * reduce阶段核心业务逻辑（）
     *
     * @param key
     * @param values  10200.....
     * @param context
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
        for (Text value : values) {
            String data = value.toString();
            map.put(data, map.getOrDefault(data, 0) + 1);//getOrDefault 方法如果在map里找不到对应键，就返回默认值 0，然后加 1，实现计数功能。
        }

        for (Map.Entry<String, Integer> entry : map.entrySet()) // 开始遍历map，这个map保存了每个数据值及其出现的频次，entrySet方法返回所有键值对的集合
            count = Math.max(count, entry.getValue()); // 找出当前map中频次最高的值，更新count变量，Math.max用于比较两个整数大小并返回较大值。

        for (Map.Entry<String, Integer> entry : map.entrySet()) { // 再次遍历map，这次目的是找到频次最高的那个数据。
            if (count == entry.getValue()) {
                outv.set("主要户型为: " + entry.getKey()); // 设置输出值，这里把出现频次最高的数据包装成特定格式的字符串。
                context.write(key, outv);
            }
        }

        count = Integer.MIN_VALUE; // 重置count变量为最小整数值，为下一组数据处理做准备。

        map.clear();
    }
}